﻿using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace 串口助手
{
    class ContextMenu
    {
        // 定义上下文菜单，分别用于不同的功能区域
        public ContextMenuStrip TxListMenu = new ContextMenuStrip(); // 发送列表的上下文菜单
        public ContextMenuStrip RxShowMenu = new ContextMenuStrip(); // 接收显示区的上下文菜单
        public ContextMenuStrip CreateSuperMsgMenu = new ContextMenuStrip(); // 创建超级报文的上下文菜单
        public ContextMenuStrip TxListSimpleMenu = new ContextMenuStrip(); // 发送列表简洁模式的上下文菜单

        // 创建超级报文的委托
        public delegate void CreateSuperMsgHandler(int rx_textbox, int tx_textbox);
        CreateSuperMsgHandler createSuperMsgHandler;

        // 字体大小和文本框的工具条
        ToolStripComboBox 字体大小 = new ToolStripComboBox();

        ToolStripTextBox 接收文本框 = new ToolStripTextBox();
        ToolStripTextBox 发送文本框 = new ToolStripTextBox();

        // 初始化发送列表的上下文菜单
        public void ContextMenuTxListInit()
        {
            TxListMenu.Name = "发送列表的右键菜单";// 设置菜单名称

            // 创建用于命名发送按钮的文本框
            ToolStripTextBox 发送按钮文本输入框 = new ToolStripTextBox();
            发送按钮文本输入框.BackColor = System.Drawing.Color.Coral;
            发送按钮文本输入框.Size = new System.Drawing.Size(150, 25);
            发送按钮文本输入框.ToolTipText = "给按钮命名";
            发送按钮文本输入框.LostFocus += new EventHandler(发送按钮文本输入框_LostFocusClick);
            TxListMenu.Items.AddRange(new ToolStripItem[]
            {
                发送按钮文本输入框,
            });

            TxListSimpleMenu.Name = "发送列表简洁模式的右键菜单";

            // 初始化接收显示区的上下文菜单
            RxShowMenu.Name = "接收显示区的右键菜单";
            ToolStripSeparator 分割线 = new ToolStripSeparator();
            ToolStripMenuItem 复制 = new ToolStripMenuItem();
            ToolStripMenuItem 粘贴 = new ToolStripMenuItem();
            ToolStripMenuItem 全选 = new ToolStripMenuItem();
            ToolStripMenuItem 清空 = new ToolStripMenuItem();
            ToolStripMenuItem 接收区解锁 = new ToolStripMenuItem();
            复制.Text = "复制";
            粘贴.Text = "粘贴";
            全选.Text = "全选";
            清空.Text = "清空";
            接收区解锁.Text = "接收区解锁";
            粘贴.BackColor = System.Drawing.Color.Gainsboro;
            清空.BackColor = System.Drawing.Color.Gainsboro;

            // 设置字体大小选择框
            字体大小.MaxLength = 4;
            字体大小.Size = new System.Drawing.Size(60, 25);
            字体大小.ToolTipText = "接收显示区的字体大小";
            字体大小.DropDownStyle = ComboBoxStyle.DropDown;
            字体大小.Items.AddRange(new object[]
            {
                "9",
                "10.5",
                "12",
                "14",
                "16",
                "18",
                "21",
                "28",
            });
            RxShowMenu.Items.AddRange(new ToolStripItem[]
            {
                复制,
                粘贴,
                全选,
                清空,
                分割线,
                接收区解锁,
                字体大小,
            });

            TxListMenu.Opening += new CancelEventHandler(发送列表右键菜单_Opening);
            RxShowMenu.Opening += new CancelEventHandler(接收显示区右键菜单_Opening);
            复制.Click += new EventHandler(复制ToolStripMenuItem_Click);
            粘贴.Click += new EventHandler(粘贴ToolStripMenuItem_Click);
            全选.Click += new EventHandler(全选ToolStripMenuItem_Click);
            清空.Click += new EventHandler(清空ToolStripMenuItem_Click);
            接收区解锁.Click += new EventHandler(接收区解锁_Click);
            字体大小.TextUpdate += new EventHandler(接收显示区字体大小_Click);
            字体大小.SelectedIndexChanged += new EventHandler(接收显示区字体大小_Click);

            ContextMenu_CreateSuperMsgInit();
        }


        /// <summary>
        /// 初始化上下文菜单用于创建超级报文。
        /// </summary>
        private void ContextMenu_CreateSuperMsgInit()
        {
            CreateSuperMsgMenu.Name = "新增超级报文";

            // 创建分隔线
            ToolStripSeparator 分割线 = new ToolStripSeparator();

            // 创建发送文本框标签
            ToolStripLabel 发送文本框 = new ToolStripLabel
            {
                Size = new Size(120, 27),
                Text = "发送文本框个数：",
                ToolTipText = "发送文本框的个数"
            };

            // 创建接收文本框标签
            ToolStripLabel 接收文本框 = new ToolStripLabel
            {
                Size = new Size(120, 27),
                Text = "接收文本框个数：",
                ToolTipText = "接收文本框的个数"
            };

            // 创建超级报文创建按钮
            ToolStripMenuItem 超级报文创建按钮 = new ToolStripMenuItem
            {
                Text = "创建",
                BackColor = Color.Coral
            };
            超级报文创建按钮.Click += new EventHandler(超级报文创建按钮ToolStripMenuItem_Click);

            // 将控件添加到上下文菜单
            CreateSuperMsgMenu.Items.AddRange(new ToolStripItem[]
            {
        接收文本框,
        发送文本框,
        分割线,
        超级报文创建按钮
            });
        }


        /// <summary>
        /// 配置超级报文创建按钮的点击事件处理程序。
        /// </summary>
        /// <param name="eventHandler">要设置的事件处理程序。</param>
        public void ContextMenu_CreateSuperMsgClickCfg(CreateSuperMsgHandler eventHandler)
        {
            createSuperMsgHandler = eventHandler;
        }



        /// <summary>
        /// 处理超级报文创建按钮的点击事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数。</param>
        private void 超级报文创建按钮ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                DataTypeConversion dataType = new DataTypeConversion();
                // 获取接收和发送文本框中的数字，并调用创建超级报文的处理程序
                createSuperMsgHandler(dataType.GetStringNumber(接收文本框.Text),
                    dataType.GetStringNumber(发送文本框.Text));
            }
            catch
            {
                // 异常处理（可扩展）
            }
        }


        /// <summary>
        /// 处理全选菜单项的点击事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数。</param>
        private void 全选ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 获取触发菜单的控件
            Control c = RxShowMenu.SourceControl;

            // 检查控件类型是否为 RichTextBox
            if (c.GetType().Name == "RichTextBox")
            {
                RichTextBox r = (RichTextBox)c;
                // 选择 RichTextBox 中的所有文本
                r.SelectAll();
            }
        }


        /// <summary>
        /// 处理复制菜单项的点击事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数。</param>
        private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 获取触发菜单的控件
            Control c = RxShowMenu.SourceControl;

            // 检查控件类型是否为 RichTextBox
            if (c.GetType().Name == "RichTextBox")
            {
                RichTextBox r = (RichTextBox)c;
                // 复制 RichTextBox 中选中的文本到剪贴板
                r.Copy();
            }
        }


        /// <summary>
        /// 处理粘贴菜单项的点击事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数。</param>
        private void 粘贴ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 获取触发菜单的控件
            Control c = RxShowMenu.SourceControl;

            // 检查控件类型是否为 RichTextBox
            if (c.GetType().Name == "RichTextBox")
            {
                RichTextBox r = (RichTextBox)c;
                // 从剪贴板粘贴文本到 RichTextBox
                r.Paste();
            }
        }


        /// <summary>
        /// 处理清空菜单项的点击事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数。</param>
        private void 清空ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 获取触发菜单的控件
            Control c = RxShowMenu.SourceControl;

            // 检查控件类型是否为 RichTextBox
            if (c.GetType().Name == "RichTextBox")
            {
                RichTextBox r = (RichTextBox)c;
                // 清空 RichTextBox 中的文本
                r.Clear();
            }
        }

        /// <summary>
        /// 处理发送按钮文本输入框失去焦点时的事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数。</param>
        private void 发送按钮文本输入框_LostFocusClick(object sender, EventArgs e)
        {
            // 获取触发菜单的控件
            Control c = TxListMenu.SourceControl;

            // 检查控件类型是否为 Button
            if (c.GetType().Name == "Button")
            {
                // 将按钮的文本设置为菜单中第一个项的文本
                ((Button)c).Text = TxListMenu.Items[0].Text;
            }
        }

        /// <summary>
        /// 处理发送列表右键菜单打开时的事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数，用于取消菜单打开。</param>
        private void 发送列表右键菜单_Opening(object sender, CancelEventArgs e)
        {
            // 获取触发菜单的控件
            Control c = TxListMenu.SourceControl;

            // 检查控件类型是否为 Button
            if (c.GetType().Name == "Button")
            {
                // 将菜单中第一个项的文本设置为按钮的文本
                Button r = (Button)c;
                TxListMenu.Items[0].Text = r.Text;
            }
        }


        /// <summary>
        /// 处理接收显示区右键菜单打开时的事件。
        /// </summary>
        /// <param name="sender">触发事件的对象。</param>
        /// <param name="e">事件参数，允许取消菜单的打开。</param>
        private void 接收显示区右键菜单_Opening(object sender, CancelEventArgs e)
        {
            // 获取触发菜单的控件
            Control c = RxShowMenu.SourceControl;

            // 检查控件类型是否为 RichTextBox
            if (c.GetType().Name == "RichTextBox")
            {
                RichTextBox r = (RichTextBox)c;

                // 将字体大小设置为 RichTextBox 的当前字体大小
                字体大小.Text = r.Font.Size.ToString();
            }
        }

        /// <summary>
        /// 处理接收显示区字体大小选择时的事件。
        /// </summary>
        /// <param name="sender">触发事件的对象，通常是字体大小的下拉框。</param>
        /// <param name="e">事件参数，包含有关事件的数据。</param>
        private void 接收显示区字体大小_Click(object sender, EventArgs e)
        {
            // 获取触发事件的控件
            Control c = RxShowMenu.SourceControl;

            // 检查控件类型是否为 RichTextBox
            if (c.GetType().Name == "RichTextBox")
            {
                RichTextBox r = (RichTextBox)c;
                try
                {
                    // 设置 RichTextBox 的字体大小为所选的值
                    r.Font = new Font(r.Font.FontFamily,
                            Convert.ToSingle(((ToolStripComboBox)sender).Text),
                            r.Font.Style);
                }
                catch
                {
                    // 如果转换失败，清空下拉框的文本
                    ((ToolStripComboBox)sender).Text = "";
                }
            }
        }


        /// <summary>
        /// 切换接收区的锁定状态（可编辑或只读）。
        /// </summary>
        /// <param name="sender">触发事件的对象，通常是用于切换状态的菜单项。</param>
        /// <param name="e">事件参数，包含有关事件的数据。</param>
        private void 接收区解锁_Click(object sender, EventArgs e)
        {
            // 将发送者转换为 ToolStripMenuItem
            ToolStripMenuItem menuItem = (ToolStripMenuItem)sender;

            // 获取右键菜单的源控件
            Control c = RxShowMenu.SourceControl;

            // 检查控件类型是否为 RichTextBox
            if (c.GetType().Name == "RichTextBox")
            {
                RichTextBox r = (RichTextBox)c;

                // 切换接收区的可编辑状态
                if (menuItem.Text == "接收区解锁")
                {
                    r.ReadOnly = false; // 设置为可编辑
                    menuItem.Text = "接收区上锁"; // 更新菜单项文本
                }
                else
                {
                    r.ReadOnly = true; // 设置为只读
                    menuItem.Text = "接收区解锁"; // 更新菜单项文本
                }
            }
        }

    }
}
